﻿#define _CRT_SECURE_NO_WARNINGS 1

#include "Contact.h"

//静态版本
//初始化通讯录
void InitContact(contact* pc)
{
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}



//静态版本
//增加联系人
void AddContact(contact* pc)
{
	assert(pc);//进行断言防止pc为空指针，它的头文件为<assert.h>
	//判断通讯录是否用空间
	if (pc->count == MAX)
	{
		printf("通讯录已满！\n");
		return;
	}
	//写入信息
	printf("请输入姓名：>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄：>");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入性别：>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话：>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址：>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("增加成功！\n");
}


//显示联系人
void ShowContact(const contact* pc)
{
	int i = 0;
	printf("%10s\t%5s\t%10s\t%12s\t%20s\n", "姓名", "年龄", "性别", "电话", "地址");//打印一个表头，要注意打印形式
	for (i = 0; i < pc->count; i++)
	{
		printf("%10s\t%5d\t%10s\t%12s\t%20s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

//找到目标联系人
int FindContact(const contact* pc, char name[])
{
	assert(pc);
	int move = 0;
	for (move = 0; move < pc->count; move++)
	{
		if (strcmp(pc->data[move].name, name) == 0)
			return move;//找到目标联系人，返回其下标
	}
	return -1;
}


//删除联系人
void DelContact(contact* pc)
{
	assert(pc);
	if (pc->count == 0)
	{
		printf("通讯录为空，无要删除的联系人！\n");
		return;
	}
	char name[20];
	printf("请输入要删除联系人的姓名：>");
	scanf("%s", name);
	//删除
	int pos = FindContact(pc, name);
	int move = 0;
	for (move = pos; move < pc->count - 1; move++)//注意防止栈溢出
	{
		pc->data[move] = pc->data[move + 1];//后面的元素向前覆盖
	}
	pc->count--;//联系人减少
	printf("删除成功！\n");
}

//查找联系人
void SearchContact(const contact* pc)
{
	char name[20];
	printf("请输入你要查找联系人的姓名：>");
	scanf("%s", name);
	int pos = FindContact(pc, name);
	if (pos == -1)
	{
		printf("未查找到该联系人!\n");
		return;
	}
	else
	{
		printf("%10s\t%5s\t%10s\t%12s\t%20s\n", "姓名", "年龄", "性别", "电话", "地址");//打印一个表头，要注意打印形式
		printf("%10s\t%5d\t%10s\t%12s\t%20s\n", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

//修改联系人信息
void ModifyContact(contact* pc)
{
	char name[20];
	printf("请输入你要修改联系人的姓名\n");
	scanf("%s", name);
	int pos = FindContact(pc, name);
	if (pos == -1)
	{
		printf("未查找到该联系人!\n");
		return;
	}
	else
	{
		printf("请输入姓名：>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄：>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别：>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话：>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入地址：>");
		scanf("%s", pc->data[pos].addr);
		printf("修改成功!\n");
	}

}


//利用姓名进行排序
int CmpByName(const void* e1, const void* e2)
{
	return strcmp(((PoInfo*)e1)->name, ((PoInfo*)e2)->name);
}
void SortContact(contact* pc)//排序，利用qsort函数
{
	assert(pc);
	qsort(pc->data, pc->count, sizeof(PoInfo), CmpByName);
}


//将通讯录信息保存到文件中
void SaveContact(contact* pc)
{
	FILE* pfWrite = fopen("Contact.txt", "w");
	int i = 0;
	fprintf(pfWrite, "%10s\t%5s\t%10s\t%12s\t%20s\n", 
		"姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->count; i++)
	{
		fprintf(pfWrite, "%10s\t%5d\t%10s\t%12s\t%20s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
	fclose(pfWrite);
	pfWrite = NULL;
}
